package com.czk.bootlettuce.config;

import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;

/**
 * 通过开启key过期的事件通知，当key过期时，会发布过期事件；我们定义key过期事件的监听器，当key过期时，就能收到回调通知。
 * <p>
 * 注意：
 * <p>
 * 　　1）由于Redis key过期删除是定时+惰性，当key过多时，删除会有延迟，回调通知同样会有延迟。因此性能较低
 * <p>
 * 　　2）且通知是一次性的，没有ack机制，若收到通知后处理失败，将不再收到通知。需自行保证收到通知后处理成功。
 * <p>
 * 　　3）通知只能拿到key，拿不到value
 * <p>
 * 　　4）Redis将数据存储在内存中，如果遇到恶意下单或者刷单的将会给内存带来巨大压力
 * <p>
 * <p>
 * <p>
 * 使用场景：
 * <p>
 * 　　1）实现延时队列
 * <p>
 * 　　　　消息作为key，将需要延迟的时间设置为key的TTL，当key过期时，在监听器收到通知，达到延迟的效果
 *
 * @author chenzhangkun
 * @ClassName RedisKeyExpirationListener
 * @description: TODO
 * @date 2024年12月24日
 */
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
	public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
		super(listenerContainer);
	}

	@Override
	public void onMessage(Message message, byte[] pattern) {
		// 打印的是key,不是key内容
		System.out.println(new String(message.getBody()));
	}
}
